#include "StdSqlite3.h"
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
struct StdSqlite3
{
    sqlite3*db;
};

SQL *StdSqlite3Init(const char *dbPath)
{   
    SQL*s = (SQL*)malloc(sizeof(SQL));
    if(s ==NULL)
    {
        printf("StdSqlite3Init malloc error!\n");
        return NULL;
    }

    int ret = sqlite3_open(dbPath,&s->db); //调用 SQLite3 库函数 sqlite3_open 来打开指定路径的数据库文件dbPath 是数据库文件的路径，是传递给函数的参数。
    if(ret != SQLITE_OK) //检查 sqlite3_open 函数的返回值 ret 是否等于 SQLITE_OK，SQLITE_OK 是 SQLite3 库中定义的一个宏，表示操作成功完成
    {
        printf("open db error :%s\n",sqlite3_errmsg(s->db)); //&s->db 是一个指向 sqlite3* 类型指针的地址，它指向了 StdSqlite3 结构体中的 db 成员变量
        free(s); //sqlite3_open 函数尝试打开指定路径的数据库文件，并将结果存储在 s->db 中。返回值 ret 是一个整数，代表函数执行的结果
        return NULL;
    }
    return s;
}

bool SQLExec(SQL *s, const char *sql)
{   
   int ret = sqlite3_exec(s->db,sql,NULL,NULL,NULL); // SQLite3 库函数 sqlite3_exec，该函数用于执行 SQL 语句。它接受数据库连接指针 s->db、要执行的 SQL 语句 sql，以及几个回调函数参数
    if(ret != SQLITE_OK)
    {
        printf("EXEC db error :%s\n",sqlite3_errmsg(s->db)); //sqlite3_errmsg(s->db) 是一个 SQLite3 库函数，它接受一个数据库连接指针作为参数，并返回一个指向最近一次发生错误的错误信息的字符串。在这里，它会返回与 s->db 相关的错误信息。
        return false;
    }
    return true;
}
char** GetTableInfo(SQL*s,const char*sql,int * row,int * column)
{
     char* *result; //声明了一个指向字符串数组的指针，用于存储查询结果
    int ret = sqlite3_get_table(s->db,sql,&result,row,column,NULL);//s->db 是一个数据库连接对象的指针，用于执行数据库查询操作
    if(ret != SQLITE_OK)
    {
         printf("get table error :%s\n",sqlite3_errmsg(s->db));
         return NULL;
    }
    return result;
}

void FreeTableInfo(char **result)
{
    sqlite3_free_table(result); //内存的释放是通过调用 sqlite3_free_table 函数来完成的
}

int GetTableLen(SQL *s, const char *tableName)
{  
    char sql[1024] = {0};
    sprintf(sql,"select count(*) from %s;",tableName); //sprintf 函数是一个格式化输出函数，它按照指定的格式将数据写入到字符数组中
    char**result = GetTableInfo(s,sql,NULL,NULL); //传递了数据库连接指针 s 和 SQL 查询语句 sql 作为参数，并且传递了两个 NULL 参数。
    if(result == NULL)
         return -1;
    int len = atoi(result[1]); //atoi 函数将这个字符串解析为一个整数 result[1] 表示从查询结果中获取的第二个元素
    sqlite3_free_table(result);
    return len;
}

void ClearSQL(SQL *s)
{ 
    sqlite3_close(s->db); //sqlite3_close(s->db) 用于关闭 SQLite 数据库连接，释放与之相关的资源
    free(s); //于释放传入的 SQL 结构体指针 s 所占用的内存空间
}
